package designpattern;


/**
 * 装饰器模式实现
 * 1. 简介
 * 允许向一个现有的对象添加新的功能，同时不改变其结构
 * 主要解决
 * 一般情况下，未来扩展一个类经常使用继承的方式，但是继承会引入静态特征，子类会存在太多不需要的方法
 * 何时使用
 * 不想添加很多子类的情况下扩展类
 * 2. 优点
 * (1) 装饰类和被装饰类可以独立发展
 * (2) 装饰器模式是继承的替代模式,可以动态扩展一个实现类的功能
 * 3. 缺点
 * 多层装饰比较复杂
 * 4. 注意
 * 5. 实现步骤
 * //1. 创建被修饰的接口
 * //2. 创建修饰类抽象类
 * //3. 继承修饰类抽象类
 */
public class DecoratorTest {
    public static void main(String[] args) {
        RedShapeDecorator redShapeDecorator = new RedShapeDecorator(new Circle03());
        redShapeDecorator.draw();
    }
}

//1. 创建一个被装饰接口Shape03
interface Shape03 {
    void draw();
}

class Rectangle03 implements Shape03 {

    @Override
    public void draw() {
        System.out.println("Shape: Rectangle");
    }
}

class Circle03 implements Shape03 {

    @Override
    public void draw() {
        System.out.println("Shape: Circle");
    }
}


// 2. 创建一个被装饰接口的抽象装饰类
abstract class ShapeDecorator implements Shape03 {
    protected Shape03 decoratedShape;

    public ShapeDecorator(Shape03 decoratedShape) {
        this.decoratedShape = decoratedShape;
    }

    @Override
    public void draw() {
        decoratedShape.draw();
    }
}

// 3. 创建装饰类的实现类
class RedShapeDecorator extends ShapeDecorator {

    public RedShapeDecorator(Shape03 decoratedShape) {
        super(decoratedShape);
    }

    @Override
    public void draw() {
        decoratedShape.draw();
        setRedBorder(decoratedShape);
    }

    private void setRedBorder(Shape03 decoratedShape) {
        System.out.println("Border Color: Red");
    }
}